package com.zjb.demo.system.mapper;

import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryChain;
import com.zjb.demo.system.domain.SysRole;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

import static com.mybatisflex.core.query.QueryMethods.distinct;
import static com.zjb.demo.system.domain.table.SysRoleTableDef.SYS_ROLE;
import static com.zjb.demo.system.domain.table.SysUserRoleTableDef.SYS_USER_ROLE;
import static com.zjb.demo.system.domain.table.UserTableDef.USER;

/**
 * @author 庄佳彬
 * @since 2023/12/28 23:02
 */
@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {
    /**
     * 根据用户ID查询该用户拥有的角色及其权限
     *
     * @param userId 用户ID
     * @return 用户拥有的角色列表
     */
    default List<SysRole> selectRolePermissionByUserId(Long userId) {
        return QueryChain.of(this)
                .select(distinct(SYS_ROLE.ROLE_ID),
                        SYS_ROLE.ROLE_NAME,
                        SYS_ROLE.ROLE_KEY,
                        SYS_ROLE.ROLE_SORT,
                        SYS_ROLE.DATA_SCOPE,
                        SYS_ROLE.MENU_CHECK_STRICTLY,
                        SYS_ROLE.DEPT_CHECK_STRICTLY,
                        SYS_ROLE.STATUS,
                        SYS_ROLE.DEL_FLAG,
                        SYS_ROLE.CREATE_TIME,
                        SYS_ROLE.REMARK)
                .from(SYS_ROLE)
                .leftJoin(SYS_USER_ROLE)
                .on(SYS_USER_ROLE.ROLE_ID.eq(SYS_ROLE.ROLE_ID))
                .where(SYS_USER_ROLE.USER_ID.eq(userId))
                .list();
    }


    /**
     * 根据用户名查询用户所关联的角色列表
     *
     * @param username 用户名
     * @return 用户所关联的角色列表
     */
    default List<SysRole> selectRolesByUserName(String username) {
        return QueryChain.of(this)
                .select(distinct(SYS_ROLE.ROLE_ID),
                        SYS_ROLE.ROLE_NAME,
                        SYS_ROLE.ROLE_KEY,
                        SYS_ROLE.ROLE_SORT,
                        SYS_ROLE.DATA_SCOPE,
                        SYS_ROLE.MENU_CHECK_STRICTLY,
                        SYS_ROLE.DEPT_CHECK_STRICTLY,
                        SYS_ROLE.STATUS,
                        SYS_ROLE.DEL_FLAG,
                        SYS_ROLE.CREATE_TIME,
                        SYS_ROLE.REMARK)
                .from(SYS_ROLE)
                .leftJoin(SYS_USER_ROLE)
                .on(SYS_USER_ROLE.ROLE_ID.eq(SYS_ROLE.ROLE_ID))
                .leftJoin(USER)
                .on(SYS_USER_ROLE.USER_ID.eq(USER.ID))
                .where(USER.USER_NAME.eq(username))
                .list();
    }

}
